package com.ziroom.crm.mq.core.retry;

import com.ziroom.crm.mq.core.context.InvokeContext;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Objects;

/**
 * <p></p>
 * <p>
 * <PRE>
 * <BR>    修改记录
 * <BR>-----------------------------------------------
 * <BR>    修改日期         修改人          修改内容
 * </PRE>
 *
 * @author WeiShaoying
 * @version 1.0
 * @date Created in 2020年09月08日 11:31
 * @since 1.0
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class RetryContext extends InvokeContext {

    /**
     * 重试类型
     */
    private RetryType retryType;

    /**
     * 当前内存重试次数（一次内存周期有效）
     */
    private Integer retryCount;

    /**
     * 下一次重试时间
     * 消息中
     */
//    private Data nextRetryTime;

    /**
     * 父级上下文
     */
    private RetryContext parent;

    /**
     * 其他因素标记是否停止重试
     */
    private boolean stopRetry;


    /**
     * 转化
     *
     * @param invokeContext
     * @param retryType
     * @return
     */
    public static RetryContext valueOf(InvokeContext invokeContext, RetryType retryType, Integer retryCount) {
        RetryContext retryContext = new RetryContext();
        retryContext.setMessage(invokeContext.getMessage());
        retryContext.setNode(invokeContext.getNode());
        retryContext.setRetryType(retryType);
        retryContext.setRetryCount(Objects.isNull(retryCount) ? 0 : retryCount);
        retryContext.stopRetry = false;
        return retryContext;
    }
}
